import { BaseProcessor } from './baseProcessor.js'
import fs from 'fs/promises'
import logger from '../../services/logger.js'

// 修改 pdf-parse 的导入和初始化
let pdfParse
const initPdfParse = async () => {
  if (!pdfParse) {
    try {
      const pdfParseModule = await import('pdf-parse/lib/pdf-parse.js')
      pdfParse = pdfParseModule.default
    } catch (error) {
      logger.error('Failed to initialize pdf-parse:', error)
      throw new Error('PDF processing module initialization failed')
    }
  }
  return pdfParse
}

export class PDFProcessor extends BaseProcessor {
  async process(filePath) {
    try {
      const dataBuffer = await fs.readFile(filePath)
      const parser = await initPdfParse()
      const pdfData = await parser(dataBuffer)
      
      // 先过滤目录，再进行其他预处理
      let text = this.filterTableOfContents(pdfData.text)
      return this.preprocessPDFText(text)
    } catch (error) {
      logger.error('PDF 处理失败:', {
        filePath,
        error: error.message
      })
      throw new Error(`PDF 处理失败: ${error.message}`)
    }
  }
  
  preprocessPDFText(text) {
    return text
      // 1. 修复被错误分割的单词
      .replace(/([a-z])-\s*\n([a-z])/gi, '$1$2')
      
      // 2. 处理页眉页脚
      .replace(/^.+\n\d+\n.+$/gm, '') // 移除页码行
      .replace(/^.{1,50}(\n|$)/gm, (match) => {
        // 如果短行看起来像页眉页脚，则移除
        if (/^\s*(\d+|page|chapter|section)/i.test(match)) {
          return ''
        }
        return match
      })
      
      // 3. 处理特殊字符和符号
      .replace(/[\uFFFD\u0000-\u0008\u000B\u000C\u000E-\u001F]/g, '') // 移除无效字符
      .replace(/\f/g, '\n\n') // 将换页符转换为段落分隔符
      .replace(/[""]/g, '"') // 统一引号
      .replace(/['']/g, "'") // 统一撇号
      .replace(/…/g, '...') // 统一省略号
      
      // 4. 处理列表和项目符号
      .replace(/^[\s•\-–—]+/gm, '- ') // 统一列表符号
      .replace(/^\d+\.\s+/gm, (match) => match.trim() + ' ') // 保持编号列表格式
      
      // 5. 合并段落
      .replace(/([a-z,;])\n([a-z])/gi, '$1 $2') // 合并被错误分行的句子
      .replace(/([.!?])\s*\n+\s*([A-Z])/g, '$1\n\n$2') // 确保句子之间有适当的分隔
      
      // 6. 处理表格和结构化内容
      .replace(/\|[\s-]+\|[\s-]+\|/g, '\n') // 移除表格分隔线
      .replace(/\|\s+/g, ' | ') // 规范化表格内容
      
      // 7. 处理代码块和缩进
      .replace(/^\s{4,}/gm, '    ') // 统一代码块缩进
      
      // 8. 规范化空白字符
      .replace(/\r\n/g, '\n')  // 统一换行符
      .replace(/\t/g, '    ') // 统一缩进为空格
      .replace(/[ \t]+/g, ' ') // 合并连续空格
      .replace(/\n\s+\n/g, '\n\n') // 减少多余的空行
      .replace(/\n{3,}/g, '\n\n') // 限制最大连续空行数
      .trim()
  }
} 